#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QVBoxLayout>
#include <QLabel>
#include <QMessageBox>
#include <QDebug>

/**
 * 主窗口构造函数
 * 
 * 简化后的流程：
 * 1. 创建UI布局
 * 2. 创建频谱显示组件
 * 3. 创建音频捕获器（包含FFT分析，在子线程）
 * 4. 连接信号槽
 * 5. 启动捕获线程
 */
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    setWindowTitle("Audio Spectrum Analyzer - Real-time FFT (子线程FFT)");
    resize(900, 500);
    
    // ========== 创建UI布局 ==========
    QWidget *centralWidget = new QWidget(this);
    QVBoxLayout *layout = new QVBoxLayout(centralWidget);
    
    // 标题标签
    QLabel *titleLabel = new QLabel("实时音频频谱分析器（FFT在子线程中执行）", this);
    titleLabel->setStyleSheet("font-size: 18px; font-weight: bold; padding: 10px;");
    titleLabel->setAlignment(Qt::AlignCenter);
    layout->addWidget(titleLabel);
    
    // 频谱显示组件
    m_spectrumWidget = new SpectrumWidget(this);
    m_spectrumWidget->setNumBands(20);
    layout->addWidget(m_spectrumWidget);
    
    // 状态标签
    QLabel *statusLabel = new QLabel("正在捕获系统音频并在子线程中分析...", this);
    statusLabel->setStyleSheet("color: #888; padding: 5px;");
    statusLabel->setAlignment(Qt::AlignCenter);
    layout->addWidget(statusLabel);
    
    setCentralWidget(centralWidget);
    
    // ========== 创建音频捕获器（包含FFT，在子线程）==========
    m_audioCapturer = new AudioCapturer(this);
    
    // 连接信号：接收频谱数据（已经是处理好的）
    connect(m_audioCapturer, &AudioCapturer::spectrumReady,
            this, &MainWindow::onSpectrumReady);
    
    // 连接信号：错误处理
    connect(m_audioCapturer, &AudioCapturer::errorOccurred,
            this, &MainWindow::onErrorOccurred);
    
    // ========== 启动捕获线程 ==========
    m_audioCapturer->start();
    
    qDebug() << "Application started - FFT running in worker thread";
}

MainWindow::~MainWindow()
{
    if (m_audioCapturer) {
        m_audioCapturer->stopCapture();
        m_audioCapturer->wait(1000);
    }
    delete ui;
}

/**
 * 频谱数据就绪槽函数
 * 
 * 数据流：AudioCapturer（子线程，已完成FFT）→ MainWindow（主线程）→ UI
 * 
 * 注意：这里接收的已经是处理好的频谱数据，不需要再做FFT
 */
void MainWindow::onSpectrumReady(const QVector<float> &spectrum)
{
    // 直接更新UI，FFT已在子线程完成
    m_spectrumWidget->updateSpectrum(spectrum);
    
    // 调试输出（可选）
    static int callCount = 0;
    if (callCount++ % 30 == 0) {  // 每30帧输出一次
        float maxVal = 0.0f;
        for (float val : spectrum) {
            maxVal = qMax(maxVal, val);
        }
        qDebug() << "Spectrum received (from worker thread): max =" << maxVal;
    }
}

void MainWindow::onErrorOccurred(const QString &error)
{
    QMessageBox::critical(this, "错误", "音频捕获错误: " + error);
}